/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.operativa;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.domain.BaseController;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.operativa.exception.OrgTurnosDetException;
import co.gov.medellin.sdep.sisdep.operativa.exception.OrgTurnosDetRuntimeException;
import co.gov.medellin.sdep.sisdep.operativa.exception.RecursoHumanoException;
import co.gov.medellin.sdep.sisdep.operativa.service.IOrgTurnosDetService;
import co.gov.medellin.sdep.sisdep.operativa.service.IRecursoHumanoService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.model.OrgTurnosDet;
import co.gov.medellin.sdep.sisdep.model.RecursoHumano;

/**
 * @author Usuario
 * 
 */
public class OrgTurnosDetController extends BaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/** bean para el manejo del formulario de busqueda OrgTurnosDet */
	public OrgTurnosDet orgTurnosDetSearch = new OrgTurnosDet();

	/** Objeto contenedor del listado de OrgTurnosDet luego de una consulta. */
	private transient DataModel orgTurnosDetListModel;

	/** bean para el manejo del formulario de creacion/edicion. OrgTurnosDet */
	private OrgTurnosDet orgTurnosDet = new OrgTurnosDet();

	/** instancia de servicio orgTurnosDetService */
	private IOrgTurnosDetService orgTurnosDetService;

	/** instancia de servicio recursoHumanoService */
	private IRecursoHumanoService recursoHumanoService;

	RecursoHumano recursoHumano = new RecursoHumano();
	
	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public OrgTurnosDetController() {
		this.orgTurnosDetListModel = new ListDataModel();
	}
	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 */
	public String searchOrgTurnosDetByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getOrgTurnosDetService().load(1, 10,
					this.orgTurnosDetSearch);
			this.orgTurnosDetListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.orgTurnosDetListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.orgTurnosDetListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.ORG_TURNOS_DET_SEARCH_VIEW;
	}

  /**
	 * Metodo que permite espeficicar la funcionalidad para la gestion [Crear / Actualizar] de un elmento tipo:
	 * OrgTurnosDet.
	 *     
	 * @author programador.java@consult-soft.com  05-06-2012
	 * @return String Vista a la cual debe retornar
	 * 	 
	 */
	public String manage() {
		String returnView = AppConstants.ORG_TURNOS_DET_SEARCH_VIEW;
		if(this.orgTurnosDet.getId() == null) {
       returnView = create();
		} else {
       returnView = update();
		}
		return returnView;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.orgTurnosDet.getId() == null) {
				checkRecursoHumanoRegistrada();
				if(recursoHumano.getId() != null && !recursoHumano.getId().equals("") &&  recursoHumano.getId() != new Long(0)){
					orgTurnosDet.setIdRecursoHumano(recursoHumano.getId());								
					getOrgTurnosDetService().insert(this.orgTurnosDet);
					msg = AppConstants.SUCCESS_CREATE;
			}else{
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("La persona debe estar registrada como recurso humano", null, null);
				return AppConstants.ORG_TURNOS_DET_CREATE_VIEW;
			}
		}	
		} catch (OrgTurnosDetException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (OrgTurnosDetRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- orgTurnosDet " + msg, null, null);
		return AppConstants.ORG_TURNOS_DET_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.orgTurnosDet.getId() != null) {
				checkRecursoHumanoRegistrada();
				if(recursoHumano.getId() != null && !recursoHumano.getId().equals("") &&  recursoHumano.getId() != new Long(0)){
					orgTurnosDet.setIdRecursoHumano(recursoHumano.getId());
					getOrgTurnosDetService().update(this.orgTurnosDet);
					msg = AppConstants.SUCCESS_UPDATE;
			}else{
				((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("La persona debe estar registrada como recurso humano", null, null);
				return AppConstants.ORG_TURNOS_DET_UPDATE_VIEW;
			}				
			}
		} catch (OrgTurnosDetException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (OrgTurnosDetRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean(AppConstants.MESSAGE_CONTROLLER_BEAN))
				.setSuccessMessage("- Valor Tipo Maestra " + msg, null, null);
		return AppConstants.ORG_TURNOS_DET_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createOrgTurnosDet() {
		orgTurnosDet = new OrgTurnosDet();
		orgTurnosDet.setId(null);
		orgTurnosDet.setUsuarioCrea(getLoggedUserID());
		orgTurnosDet.setUsuarioModifica(getLoggedUserID());	
		orgTurnosDet.setFecha(orgTurnosDetSearch.getFecha());
		orgTurnosDet.setTurno(orgTurnosDetSearch.getTurno());
		orgTurnosDet.setIdTurno(orgTurnosDetSearch.getIdTurno());
		return AppConstants.ORG_TURNOS_DET_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateOrgTurnosDet() {
		Map params = getExternalContext().getRequestParameterMap();
		String orgTurnosDetDataIndex = (String) params
				.get("orgTurnosDetDataIndex");
		this.orgTurnosDet = (OrgTurnosDet) ((List) this.orgTurnosDetListModel
				.getWrappedData())
				.get(Integer.parseInt(orgTurnosDetDataIndex));
		checkRecursoHumanoRegistrada();
		return AppConstants.ORG_TURNOS_DET_UPDATE_VIEW;
	}
	
	public String checkRecursoHumanoRegistrada() {
		if ((orgTurnosDet.getIdTipoDocumentoStr() != null && 
				!orgTurnosDet.getIdTipoDocumentoStr().equals("") && 
				orgTurnosDet.getIdTipoDocumentoStr().length() > 0)
				&& (orgTurnosDet.getDocumentoPersona() != null && 
					!orgTurnosDet.getDocumentoPersona().equals("") &&
					orgTurnosDet.getDocumentoPersona().length() > 0)) {
			//Verificamos si la persona se encuentra registrada
			try {
				//Busqueda por tipo identificacion e identificacion
				getRecursoHumano().setIdentificacion(orgTurnosDet.getDocumentoPersona());
				getRecursoHumano().setIdTipoIdentificacionStr(orgTurnosDet.getIdTipoDocumentoStr());
				recursoHumano = getRecursoHumanoService().findByRelated(getRecursoHumano());
			} catch (RecursoHumanoException e) {
				e.printStackTrace(System.err);
			}
		}
		if(null == recursoHumano) {
			recursoHumano = new RecursoHumano();
			recursoHumano.setNombreCompleto("N/A");
			recursoHumano.setArea("N/A");
		}
		return "";
	}

	/**
	 * 
	 * @return
	 */
	public String cancelOrgTurnosDet() {
		return AppConstants.ORG_TURNOS_DET_SEARCH_VIEW;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public OrgTurnosDet getOrgTurnosDetSearch() {
		return orgTurnosDetSearch;
	}

	/**
	 * 
	 * @param orgTurnosDetSearch
	 */
	public void setorgTurnosDetSearch(OrgTurnosDet orgTurnosDetSearch) {
		this.orgTurnosDetSearch = orgTurnosDetSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getorgTurnosDetListModel() {
		return orgTurnosDetListModel;
	}

	/**
	 * 
	 * @param orgTurnosDetListModel
	 */
	public void setorgTurnosDetListModel(DataModel orgTurnosDetListModel) {
		this.orgTurnosDetListModel = orgTurnosDetListModel;
	}

	/**
	 * 
	 * @return
	 */
	public OrgTurnosDet getOrgTurnosDet() {
		return orgTurnosDet;
	}

	/**
	 * 
	 * @param orgTurnosDet
	 */
	public void setorgTurnosDet(OrgTurnosDet orgTurnosDet) {
		this.orgTurnosDet = orgTurnosDet;
	}

	/**
	 * obtencion del servicio orgTurnosDetService
	 * 
	 * @return
	 */
	public IOrgTurnosDetService getOrgTurnosDetService() {
		return orgTurnosDetService;
	}

	/**
	 * establecimiento del servicio orgTurnosDetService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param orgTurnosDetService
	 */
	public void setOrgTurnosDetService(
			IOrgTurnosDetService orgTurnosDetService) {
		this.orgTurnosDetService = orgTurnosDetService;
	}

	public IRecursoHumanoService getRecursoHumanoService() {
		return recursoHumanoService;
	}

	public void setRecursoHumanoService(IRecursoHumanoService recursoHumanoService) {
		this.recursoHumanoService = recursoHumanoService;
	}

	public RecursoHumano getRecursoHumano() {
		return recursoHumano;
	}

	public void setRecursoHumano(RecursoHumano recursoHumano) {
		this.recursoHumano = recursoHumano;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
